package com.cencat.common.enums;

/**
 * 数据权限范围枚举
 * 
 * @author cencat
 * @since 2024-01-01
 */
public enum DataScope {

    /**
     * 全部数据权限
     */
    ALL(1, "全部数据", "1=1"),

    /**
     * 部门数据权限
     */
    DEPT(2, "部门数据", "dept_id IN (SELECT id FROM sys_dept WHERE find_in_set(id, #{deptIds}))"),

    /**
     * 部门及以下数据权限
     */
    DEPT_AND_CHILD(3, "部门及以下数据", "dept_id IN (SELECT id FROM sys_dept WHERE find_in_set(id, #{deptIds}) OR find_in_set(parent_id, #{deptIds}))"),

    /**
     * 仅本人数据权限
     */
    SELF(4, "仅本人数据", "create_by = #{userId}"),

    /**
     * 自定义数据权限
     */
    CUSTOM(5, "自定义数据", "");

    /**
     * 权限码
     */
    private final Integer code;

    /**
     * 权限描述
     */
    private final String description;

    /**
     * SQL条件模板
     */
    private final String sqlTemplate;

    /**
     * 构造函数
     * 
     * @param code 权限码
     * @param description 权限描述
     * @param sqlTemplate SQL条件模板
     */
    DataScope(Integer code, String description, String sqlTemplate) {
        this.code = code;
        this.description = description;
        this.sqlTemplate = sqlTemplate;
    }

    /**
     * 获取权限码
     * 
     * @return 权限码
     */
    public Integer getCode() {
        return code;
    }

    /**
     * 获取权限描述
     * 
     * @return 权限描述
     */
    public String getDescription() {
        return description;
    }

    /**
     * 获取SQL条件模板
     * 
     * @return SQL条件模板
     */
    public String getSqlTemplate() {
        return sqlTemplate;
    }

    /**
     * 根据权限码获取枚举
     * 
     * @param code 权限码
     * @return 枚举值
     */
    public static DataScope getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (DataScope scope : values()) {
            if (scope.getCode().equals(code)) {
                return scope;
            }
        }
        return null;
    }

    /**
     * 根据描述获取枚举
     * 
     * @param description 描述
     * @return 枚举值
     */
    public static DataScope getByDescription(String description) {
        if (description == null || description.trim().isEmpty()) {
            return null;
        }
        for (DataScope scope : values()) {
            if (scope.getDescription().equals(description.trim())) {
                return scope;
            }
        }
        return null;
    }

    /**
     * 判断是否为全部数据权限
     * 
     * @return 是否为全部数据权限
     */
    public boolean isAll() {
        return this == ALL;
    }

    /**
     * 判断是否为部门数据权限
     * 
     * @return 是否为部门数据权限
     */
    public boolean isDept() {
        return this == DEPT;
    }

    /**
     * 判断是否为部门及以下数据权限
     * 
     * @return 是否为部门及以下数据权限
     */
    public boolean isDeptAndChild() {
        return this == DEPT_AND_CHILD;
    }

    /**
     * 判断是否为仅本人数据权限
     * 
     * @return 是否为仅本人数据权限
     */
    public boolean isSelf() {
        return this == SELF;
    }

    /**
     * 判断是否为自定义数据权限
     * 
     * @return 是否为自定义数据权限
     */
    public boolean isCustom() {
        return this == CUSTOM;
    }

    /**
     * 判断是否需要自定义SQL条件
     * 
     * @return 是否需要自定义SQL条件
     */
    public boolean needsCustomCondition() {
        return this == CUSTOM;
    }

    @Override
    public String toString() {
        return description;
    }
}